package com.jili.dynamic;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * ClassName: ProxyFactory
 * Package com.jili.dynamic
 * Description:
 *
 * @Author: 廖继礼
 * @Create: 2025/3/9
 * @Version: v1.0
 */
@Slf4j
public class ProxyFactory {

    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    /** invoke：调用代理的方法都会执行此方法
     * newProxyInstance：创建一个代理实例
     * classLoader：加载动态生成类的代理类的类加载器
     * interfaces：目标对象实现的所有类接口的class对象所组成的数组
     * invocationHandler：设置代理对象实现目标对象方法的过程，即代理类中如何重写接口中的抽象方法
     */
    public Object getProxy() {
        ClassLoader classLoader = target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                log.info("方法之前");
                Object object = method.invoke(target, args);
                log.info("方法之后");
                return object;
            }
        };
        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }
}
